package Discovery;
import Commons.Address;
import Commons.ComandoWorker;
import Commons.Indirizzi;
import Commons.TaskDescriptor;
import Commons.Utility;
import Commons.WorkerDescriptor;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**Questa è la classe che implementa la comunicazione a basso livello con il WorkerDiscovery in modalità UDP PUSH.
 *
 * @author Team5
 * @see WorkerDiscoveryProxy WorkerDiscovery
 */
public class WorkerDiscoveryProxy_UDP_PUSH extends WorkerDiscoveryProxy {
 /**
    
    /**
     * Porta del WFQueueManager
     */
    private int portWf;

    /**
     * Porta del FileRecieveManager
     */
    private int portFile;

      /**Costruttore di default. Associa come predefiniti i seguenti parametri di invio:
     * <ul>
     *      <li><b>address=</b>localhost</li>
     *      <li><b>portWf=</b>12345</li>
     *      <li><b>portFile=</b>12346</li>
     * </ul>
     * @throws UnknownHostException
     */

    private InetAddress addressDelDiscovery;
    private int portaDelDiscovery;
    private int portaWorkerRicezione;


    public WorkerDiscoveryProxy_UDP_PUSH() throws UnknownHostException{
        addressDelDiscovery=InetAddress.getByName(Indirizzi.indirizzoDiscovery);

        portaDelDiscovery=16000;
        portaWorkerRicezione=16500;
    
    }

    


    @Override
    public Address getWorker(TaskDescriptor td) {

        Utility u=new Utility();
        try {
            System.out.println("WDPUP: invio TD "+td.getID());
            u.invioOggettoSerializzatoUDP(td,addressDelDiscovery,5556);
            System.out.println("WDPUP: inizializzo server ricezione");
            u.inizializzaServerRicezioneUDP(5555);
            Address a=(Address) u.riceviOggettoSerializzatoUDP();
            System.out.println("WDPUP: ricevuto indirizzo "+a.getIP());
            u.chiudiSocket();
            System.out.println("WDPUP: socket chiusa");
            return a;

            

        } catch (Exception ex) {
            Logger.getLogger(WorkerDiscoveryProxy_UDP_PUSH.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        
    }
    @Override
    public int updateWorker(int index, WorkerDescriptor wd) {
         Utility u=new Utility();
         Utility u2=new Utility();
         try {
            ComandoWorker cw= new ComandoWorker("Aggiorna",wd,index);
            u.invioOggettoSerializzatoUDP(cw,this.addressDelDiscovery,this.portaDelDiscovery);
            u2.inizializzaServerRicezioneUDP(this.portaWorkerRicezione);
            Integer check = (Integer) u2.riceviOggettoSerializzatoUDP();
            u.chiudiSocket();
            u2.chiudiSocket();
            return check;



        } catch (Exception ex) {
            Logger.getLogger(WorkerDiscoveryProxy_UDP_PUSH.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
    }
    @Override
    public int addworker(WorkerDescriptor wd) {
         Utility u=new Utility();
         Utility u2=new Utility();
         try {
            System.out.println("WDPUP: invio WD "+wd.getAddr()+" nel Server: "+this.addressDelDiscovery+" porta: "+this.portaDelDiscovery);
            ComandoWorker cw= new ComandoWorker("Aggiungi",wd,0);
            u.invioOggettoSerializzatoUDP(cw,this.addressDelDiscovery,this.portaDelDiscovery);

            u2.inizializzaServerRicezioneUDP(this.portaWorkerRicezione);
           
            Integer posizioneNellaListaDelDiscovery = (Integer) u2.riceviOggettoSerializzatoUDP();
            u.chiudiSocket();
            u2.chiudiSocket();
            return posizioneNellaListaDelDiscovery;



        } catch (Exception ex) {
            Logger.getLogger(WorkerDiscoveryProxy_UDP_PUSH.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
    }

}
